package entidades.politica;

import java.util.ArrayList;

import util.Util;
import util.exceptions.NaoExisteBlocoASerTrocadoException;
import entidades.Peer;

public class PoliticaSelecaoBlocosMaisRaro extends PoliticaSelecaoBlocos {

	private int[] disponibilidadeBlocos;
	
	public PoliticaSelecaoBlocosMaisRaro() {
		super();
		this.disponibilidadeBlocos = new int[Util.BLOCOS];
		
		for (int i=0; i<Util.BLOCOS; i++) {
			this.disponibilidadeBlocos[i] = 0;
		}
	}

	@Override
	public int seleciona(Peer peerOrigem, Peer peerDestino) throws NaoExisteBlocoASerTrocadoException {
		ArrayList<Integer> blocosUteis = super.selecionaBlocosUteis(peerOrigem, peerDestino);
		
		if (blocosUteis.isEmpty()) {
			throw new NaoExisteBlocoASerTrocadoException();
		}
		
		return selecionaBloco(blocosUteis);
	}

	@Override
	public int seleciona(Peer peerDestino) {
		ArrayList<Integer> blocosUteis = super.selecionaBlocosUteis(peerDestino);
		
		return selecionaBloco(blocosUteis);
	}

	private int selecionaBloco(ArrayList<Integer> blocosUteis) {
		int blocoMaisRaro = blocosUteis.get(0);
		int raridade = this.disponibilidadeBlocos[blocoMaisRaro];
		
		for (Integer blocoUtil : blocosUteis) {
			if (raridade > this.disponibilidadeBlocos[blocoUtil]) {
				blocoMaisRaro = blocoUtil;
				raridade = this.disponibilidadeBlocos[blocoUtil];
			}
		}
		
		return blocoMaisRaro;
	}

	public void atualizaDisponibilidade(int bloco) {
		this.disponibilidadeBlocos[bloco]++;
	}
	
}
